/** * Copyright © 2010-2014 Nokia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jsonschema2pojo.integration; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import org.jsonschema2pojo.integration.util.Jsonschema2PojoRule; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.thoughtworks.qdox.JavaDocBuilder; import com.thoughtworks.qdox.model.JavaClass; import com.thoughtworks.qdox.model.JavaField; /** * Created by cmb on 31.01.16. */ public class JavaNameIT { @Rule public Jsonschema2PojoRule schemaRule = new Jsonschema2PojoRule(); private final ObjectMapper mapper = new ObjectMapper(); @BeforeClass public static void generateAndCompileClass() throws ClassNotFoundException, IOException { } @Test public void propertiesHaveCorrectNames() throws IllegalAccessException, InstantiationException, ClassNotFoundException { ClassLoader javaNameClassLoader = schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); Class<?> classWithJavaNames = javaNameClassLoader.loadClass("com.example.javaname.JavaName"); Object instance = classWithJavaNames.newInstance(); assertThat(instance, hasProperty("javaProperty")); assertThat(instance, hasProperty("propertyWithoutJavaName")); assertThat(instance, hasProperty("javaEnum")); assertThat(instance, hasProperty("enumWithoutJavaName")); assertThat(instance, hasProperty("javaObject")); assertThat(instance, hasProperty("objectWithoutJavaName")); } @Test public void propertiesHaveCorrectTypes() throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchFieldException, IntrospectionException { ClassLoader javaNameClassLoader = schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); Class<?> classWithJavaNames = javaNameClassLoader.loadClass("com.example.javaname.JavaName"); classWithJavaNames.newInstance(); assertThat(classWithJavaNames.getDeclaredField("javaEnum").getType(), typeCompatibleWith(javaNameClassLoader.loadClass("com.example.javaname.JavaName$JavaEnum"))); assertThat(classWithJavaNames.getDeclaredField("enumWithoutJavaName").getType(), typeCompatibleWith(javaNameClassLoader.loadClass("com.example.javaname.JavaName$EnumWithoutJavaName"))); assertThat(classWithJavaNames.getDeclaredField("javaObject").getType(), typeCompatibleWith(javaNameClassLoader.loadClass("com.example.javaname.JavaObject"))); assertThat(classWithJavaNames.getDeclaredField("objectWithoutJavaName").getType(), typeCompatibleWith(javaNameClassLoader.loadClass("com.example.javaname.ObjectWithoutJavaName"))); } @Test public void gettersHaveCorrectNames() throws NoSuchMethodException, IllegalAccessException, InstantiationException, ClassNotFoundException { ClassLoader javaNameClassLoader = schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); Class<?> classWithJavaNames = javaNameClassLoader.loadClass("com.example.javaname.JavaName"); classWithJavaNames.getMethod("getJavaProperty"); classWithJavaNames.getMethod("getPropertyWithoutJavaName"); classWithJavaNames.getMethod("getJavaEnum"); classWithJavaNames.getMethod("getEnumWithoutJavaName"); classWithJavaNames.getMethod("getJavaObject"); classWithJavaNames.getMethod("getObjectWithoutJavaName"); } @Test public void settersHaveCorrectNamesAndArgumentTypes() throws NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException { ClassLoader javaNameClassLoader = schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); Class<?> classWithJavaNames = javaNameClassLoader.loadClass("com.example.javaname.JavaName"); classWithJavaNames.getMethod("setJavaProperty", String.class); classWithJavaNames.getMethod("setPropertyWithoutJavaName", String.class); classWithJavaNames.getMethod("setJavaEnum", javaNameClassLoader.loadClass("com.example.javaname.JavaName$JavaEnum")); classWithJavaNames.getMethod("setEnumWithoutJavaName", javaNameClassLoader.loadClass("com.example.javaname.JavaName$EnumWithoutJavaName")); classWithJavaNames.getMethod("setJavaObject", javaNameClassLoader.loadClass("com.example.javaname.JavaObject")); classWithJavaNames.getMethod("setObjectWithoutJavaName", javaNameClassLoader.loadClass("com.example.javaname.ObjectWithoutJavaName")); } @Test public void serializedPropertiesHaveCorrectNames() throws IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException, ClassNotFoundException { ClassLoader javaNameClassLoader = schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); Class<?> classWithJavaNames = javaNameClassLoader.loadClass("com.example.javaname.JavaName"); Object instance = classWithJavaNames.newInstance(); new PropertyDescriptor("javaProperty", classWithJavaNames).getWriteMethod().invoke(instance, "abc"); new PropertyDescriptor("propertyWithoutJavaName", classWithJavaNames).getWriteMethod().invoke(instance, "abc"); JsonNode serialized = mapper.valueToTree(instance); assertThat(serialized.has("propertyWithJavaName"), is(true)); assertThat(serialized.has("propertyWithoutJavaName"), is(true)); } @Test public void originalPropertyNamesAppearInJavaDoc() throws NoSuchFieldException, IOException { schemaRule.generateAndCompile("/schema/javaName/javaName.json", "com.example.javaname"); File generatedJavaFile = schemaRule.generated("com/example/javaname/JavaName.java"); JavaDocBuilder javaDocBuilder = new JavaDocBuilder(); javaDocBuilder.addSource(generatedJavaFile); JavaClass classWithDescription = javaDocBuilder.getClassByName("com.example.javaname.JavaName"); JavaField javaPropertyField = classWithDescription.getFieldByName("javaProperty"); assertThat(javaPropertyField.getComment(), containsString("Corresponds to the \"propertyWithJavaName\" property.")); JavaField javaEnumField = classWithDescription.getFieldByName("javaEnum"); assertThat(javaEnumField.getComment(), containsString("Corresponds to the \"enumWithJavaName\" property.")); JavaField javaObjectField = classWithDescription.getFieldByName("javaObject"); assertThat(javaObjectField.getComment(), containsString("Corresponds to the \"objectWithJavaName\" property.")); } @Test(expected = IllegalArgumentException.class) public void doesNotAllowDuplicateNames() { schemaRule.generateAndCompile("/schema/javaName/duplicateName.json", "com.example"); } @Test(expected = IllegalArgumentException.class) public void doesNotAllowDuplicateDefaultNames() { schemaRule.generateAndCompile("/schema/javaName/duplicateDefaultName.json", "com.example"); } @Test public void arrayRequiredAppearsInFieldJavadoc() throws IOException { schemaRule.generateAndCompile("/schema/javaName/javaNameWithRequiredProperties.json", "com.example.required"); File generatedJavaFileWithRequiredProperties = schemaRule.generated("com/example/required/JavaNameWithRequiredProperties.java"); JavaDocBuilder javaDocBuilder = new JavaDocBuilder(); javaDocBuilder.addSource(generatedJavaFileWithRequiredProperties); JavaClass classWithRequiredProperties = javaDocBuilder.getClassByName("com.example.required.JavaNameWithRequiredProperties"); JavaField javaFieldWithoutJavaName = classWithRequiredProperties.getFieldByName("requiredPropertyWithoutJavaName"); JavaField javaFieldWithJavaName = classWithRequiredProperties.getFieldByName("requiredPropertyWithoutJavaName"); assertThat(javaFieldWithoutJavaName.getComment(), containsString("(Required)")); assertThat(javaFieldWithJavaName.getComment(), containsString("(Required)")); } @Test public void inlineRequiredAppearsInFieldJavadoc() throws IOException { schemaRule.generateAndCompile("/schema/javaName/javaNameWithRequiredProperties.json", "com.example.required"); File generatedJavaFileWithRequiredProperties = schemaRule.generated("com/example/required/JavaNameWithRequiredProperties.java"); JavaDocBuilder javaDocBuilder = new JavaDocBuilder(); javaDocBuilder.addSource(generatedJavaFileWithRequiredProperties); JavaClass classWithRequiredProperties = javaDocBuilder.getClassByName("com.example.required.JavaNameWithRequiredProperties"); JavaField javaFieldWithoutJavaName = classWithRequiredProperties.getFieldByName("inlineRequiredPropertyWithoutJavaName"); JavaField javaFieldWithJavaName = classWithRequiredProperties.getFieldByName("inlineRequiredPropertyWithoutJavaName"); assertThat(javaFieldWithoutJavaName.getComment(), containsString("(Required)")); assertThat(javaFieldWithJavaName.getComment(), containsString("(Required)")); } }